/**
 * @文件名 StringUtil.java
 * @包名 com.ykfk.cngrain.tbw.util
 * @说明  类字符串处理工具类
 * @作者 wdfwang
 * @时间 2013-2-19 上午10:47:32
 * @版本 V1.0
 */ 
package com.fang.yttz.util;

import javax.servlet.http.HttpServletRequest;

import org.nutz.lang.Strings;
import org.nutz.lang.random.R;

/**
 * @类名 StringUtil
 * @描述 字符串处理工具类
 * @作者 wdfwang
 * @日期 2013-2-19 上午10:47:32
 * ========修改日志=======
 *
 */
public class StringUtil extends Strings{
	/**
	 * 
	 * @名称 getSetLenStr
	 * @描述 等字节取字符StringUtil.getSetLenStr("23你好",5)
	 * @参数 @param input
	 * @参数 @param size
	 * @参数 @return
	 * @返回值 String
	 * @作者 wdfwang
	 * @时间 2013-2-19 上午10:49:16
	 */
	public static String getSetLenStr(String input, int size) {
		if(input == null)
			return null;
		if(size<1)
			return input;
		String str_end = "";
		try {
			if(input.getBytes("GBK").length > size){
				String temString = "";
				int a = 0;
				int b = 0;
				while(1 > 0){
					temString = input.substring(a,++a);
					int str_len = temString.getBytes("GBK").length;
					if(str_len <= size - b){
						str_end += temString;
						b += str_len;
					}else if(str_len > size-b && b < size){
						str_end += " ";
						b += str_len;
					}
					if(b >= size)
						break;
				}
				str_end += "...";
			} else {
				str_end = input;
			}
		} catch (Exception e) {
			str_end = input;
			e.printStackTrace();
		}
		return str_end;
	}
	/**
	 * 
	 * @名称 getIpAddr
	 * @描述 获得Ip地址
	 * @参数 @param request
	 * @参数 @return
	 * @返回值 String
	 * @作者 wdfang
	 * @时间 2013-2-19 上午11:04:32
	 */
	public static String getIpAddr(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}
	/**
	 * 
	 * @名称 getBigMoney
	 * @描述 获得大写金额
	 * @参数 @param value
	 * @参数 @return
	 * @返回值 String
	 * @作者 wdfang
	 * @时间 2013-2-19 上午11:19:26
	 */
	public static String getBigMoney(double value) {
		char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
		char[] vunit = { '万', '亿' }; // 段名表示
		char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
		long midVal = (long) (value * 100); // 转化成整形
		String valStr = String.valueOf(midVal); // 转化成字符串
		String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
		String rail = valStr.substring(valStr.length() - 2); // 取小数部分

		String prefix = " "; // 整数部分转化的结果
		String suffix = " "; // 小数部分转化的结果
		// 处理小数点后面的数
		if (rail.equals("00 ")) { // 如果小数部分为0
			suffix = "整 ";
		} else {
			suffix = digit[rail.charAt(0) - '0'] + "角"
					+ digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
		}
		// 处理小数点前面的数
		char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
		char zero = '0'; // 标志'0'表示出现过0
		byte zeroSerNum = 0; // 连续出现0的次数
		for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
			int idx = (chDig.length - i - 1) % 4; // 取段内位置
			int vidx = (chDig.length - i - 1) / 4; // 取段位置
			if (chDig[i] == '0') { // 如果当前字符是0
				zeroSerNum++; // 连续0次数递增
				if (zero == '0') { // 标志
					zero = digit[0];
				} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
					prefix += vunit[vidx - 1];
					zero = '0';
				}
				continue;
			}
			zeroSerNum = 0; // 连续0次数清零
			if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的
				prefix += zero;
				zero = '0';
			}
			prefix += digit[chDig[i] - '0']; // 转化该数字表示
			if (idx > 0)
				prefix += hunit[idx - 1];
			if (idx == 0 && vidx > 0) {
				prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
			}
		}

		if (prefix.length() > 0)
			prefix += '圆'; // 如果整数部分存在,则有圆的字样
		return prefix + suffix; // 返回正确表示
	}
	/**
	 * 
	 * @类名 StringKeyGenerator
	 * @描述	 唯一主键生成
	 * 		 生成规则：时间年月日时分秒占用14位+随机数[0-9a-zA-Z]占用8位+访问数量[10001~999999999]左补占用10位
	 * 		运用随机数是因为，防止时间控制不到位，本地系统与服务器系统时间不一致，或者并发访问的数量太大
	 * 
	 *      注：可以运用R.UU16()直接获得32位的唯一数据				
	 * @作者 wdfang
	 * @日期 2013-2-22 上午12:25:49
	 * ========修改日志=======
	 *
	 */
	public static class StringKeyGenerator{
		/**
		 * 15位 时间 格式：20000101000000[yyyyMMdd_hhmmss]
		 */
		private static String dataTime = "";
		/**
		 * 该秒钟访问的数量位数 countNum>=10000且countNum<=999999999
		 * 即countNum占11位 不足11位时 左补0
		 */
		private static long countNum = 10000;
		/**
		 * 上次生成的主键值
		 */
		private static String stringKeyGenerator = "";
		/**
		 * 
		 * @名称 stringKeyGenerator
		 * @描述   返回的是32位数值
		 * @参数 @return
		 * @返回值 String
		 * @作者 wdfang
		 * @时间 2013-2-21 下午11:55:49
		 */
		public synchronized static String keyGenerator() {
			/**
			 * 获得当前时间[占15位]
			 */
			String dataTimeStr = DateUtil.getDate("yyyyMMddHHmmss");
			/**
			 * 32位数的后15位
			 */
			String countStr = "";
			if(stringKeyGenerator.length()>0){//不是首次使用
				if(dataTime.equals(dataTimeStr)){//同一时间（精确到秒），访问使用
					if(countNum == 999999999){//同一时间（精确到秒），访问使用,数量到达最达限制
						countStr = StringUtil.alignRight(countNum, 10, '0');
					}else{
						countStr = StringUtil.alignRight(++countNum, 10, '0');
					}
				}else{//时间不相同
					countNum = 10000;
					countStr = StringUtil.alignRight(++countNum, 10, '0');
				}
			}else{//首次使用
				countNum = 10000;
				countStr = StringUtil.alignRight(++countNum, 10, '0');
			}
			stringKeyGenerator = dataTimeStr + R.sg(8).next() + countStr;
			dataTime = dataTimeStr;
			return stringKeyGenerator;
		}
	}
}
